//这是用来测试学习抽象类的Test类


/**
 * 在面向对象的概念中，所有的对象都是通过类来描述的，但是反过来，并不是所有的类都是用来描述对象的
 * 如果一个类中，并没有足够的信息来描述一个具体的对象，那么这个类就是一个抽象类
 * 比如在打印图形的例子中，Shape中的draw并没有什么实际的工作，主要的工作
 * 都是由Shape的子类中重写的draw方法完成。
 * 像这种并没有实际工作的方法，可以设计成抽象方法，包含抽象方法的类，设计为抽象类
 */

//抽象类是被abstract修饰的
//被abstract修饰的方法 称为抽象方法，该方法可以没有具体的实现
//当一个类中含有抽象方法的时候，该类就必须用abstract修饰


//Shape类abstract修饰，是一个抽象类
//public abstract class Shape {
//
//    //draw方法被abstract修饰，成为一个抽象方法
//    //抽象方法可以没有方法体，因为本就不需要这个方法有实际工作
//    //它只作为一个父类方法被子类继承后各自实现子类特有的即可
//    abstract public void draw();
////        System.out.println("aaa");//err 抽象类方法不能有具体的实现
//
//    //但抽象类也是类，也可以有和普通类一样的成员变量，成员方法
//    public int r;
//    public int d;
//    public int area;
//    public double getArea(){
//        return area;
//    }
//}

//public abstract class Shape {
//抽象类不能直接实例化对象
//    Shape shape = new Shape();//err

//抽象方法是不能被private修饰的
//抽象方法也不能被 final static修饰，因为抽象方法要在子类中被重写

//抽象类是必须被继承的，且必须在子类中重写父类的抽象方法
//}

public class Test {
    public static void main(String[] args) {
        Circle circle = new Circle(3.0);
        circle.calArea();
        circle.draw();
    }
}


